/*
Copyright 2000-2011 Francois de Bertrand de Beuvron

This file is part of CoursBeuvron.

CoursBeuvron is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

CoursBeuvron is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with CoursBeuvron.  If not, see <http://www.gnu.org/licenses/>.
 */
package fr.insa.beuvron.tps.m2.dessin2DV3;

import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;

/**
 * Chaque figure aura des attributs diférents, et il est impossible de fournir
 * la définition des méthodes au niveau de Figure : elle devront être définies 
 * dans les sous-classes. Figure est donc défini comme une interface plûtot
 * qu'une classe. (On aurait également pu utiliser une classe abstraite)
 * @author FdB
 */
public interface Figure {

    /**
     * @return abscisse maximale de la figure
     */
    public double maxX();

    /**
     * @return abscisse minimale de la figure
     */
    public double minX();

    /**
     * @return ordonnée maximale de la figure
     */
    public double maxY();

    /**
     * @return ordonnée minimale de la figure
     */
    public double minY();

    /**
     * distance (euclidienne) entre une figure et un point
     * @param p un point
     * @return la distance entre this et p
     */
    public double distance(Point p);
    
    /**
     * doit dessiner la figure dans la zone graphique représentée par le 
     * Graphics2D, sachant que la figure doit d'abord subir la transformation
     * curTrans
     * @param g la zone de dessin graphique
     * @param curTrans la transformation à appliquer à la figure avant dessin
     */
    public void dessine(Graphics2D g,AffineTransform curTrans);
    
    /**
     * permet d'afficher une description complète d'une figure en tenant compte
     * de l'imbrication des FigureComposee
     * 
     * @param niveau le nombre de FigureComposee englobant la figure (0 pour
     * une figure autonome)
     * @return une description détaillée de la figure
     */
    public String jolieDescription(int niveau);
}
